#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include "termino.h"


char* pasar_de_lista_a_frase(lista_t* lista_de_componentes){

	char* primer_elemento = (char*)lista_ver_primero(lista_de_componentes);
	
	size_t tamanio_inicial_buffer = strlen(primer_elemento);
	 
	char* buffer = malloc(sizeof(char)*(tamanio_inicial_buffer + 2)); // (el \0 y el espacio).
	strcpy(buffer,"\0");
	
	lista_iter_t* iter = lista_iter_crear(lista_de_componentes);
	while (true){
		char* palabra = (char*) lista_iter_ver_actual(iter);
		strcat(buffer, palabra);
		
		
		lista_iter_avanzar(iter);
		
		char* nuevo_elemento = (char*)lista_iter_ver_actual(iter);
		
		if (!nuevo_elemento) 
			break;
		//esto lo pongo desp del break para que no sobre 1 espacio
		strcat(buffer," ");
		
		size_t tamanio_nuevo_elemento = strlen(nuevo_elemento);
		size_t tamanio_viejo_buffer = strlen(buffer);
		
		char* aux =  malloc(sizeof(char)*(tamanio_viejo_buffer +2));
		strcpy(aux,buffer);
		
		free(buffer);
		
		buffer = malloc(sizeof(char)*(tamanio_nuevo_elemento + tamanio_viejo_buffer + 2));
		
		strcpy(buffer,aux);	
	
		free(aux);
	}
	lista_iter_destruir(iter);
	
	return buffer;
}



/* 
	Devuelve un termino con un string concatenando todas las palabras de la lista,
	separadas por un espacio, como valor. 
*/
termino_t* termino_crear(lista_t* lista_de_componentes){
	termino_t* termino = malloc(sizeof(termino_t));
	if (!termino)
		return NULL;
	termino->repeticiones = malloc(sizeof(int*));
	
	if (!termino->repeticiones)
		return NULL;
	*(termino->repeticiones) = 0;
	
	char* valor = pasar_de_lista_a_frase(lista_de_componentes);
	
	termino->valor = valor;
	termino->componentes = lista_de_componentes;	
	
	return termino;
}


void termino_incrementar_repeticiones(termino_t* term, int incremento){

	*term->repeticiones += incremento;

}


void termino_destruir(termino_t* termino){
	free(termino->valor);
	free(termino->repeticiones);
	lista_destruir(termino->componentes,free);
	free(termino);
}


